#pragma once

#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

#include "smart_ptr/smart_ptr.hpp"
#include "smart_ptr/cast.hpp"




/// Generic smart_ptr definition to spare a view characters when typing
#define SMART_PTR(T, OP, CP, SP) boostext::smart_ptr<T,boostext::OP,boostext::CP,boostext::SP>
/// Generic smart_ptr definition to spare a view characters when typing
#define DEFINE_SMART_PTR(T, OP, CP, SP) typedef boostext::smart_ptr<T,boostext::OP,boostext::CP,boostext::SP>  T##Ptr;

/// Definition for a smart pointer to a reference counted object, stored on the heap
/// that may be NULL
#define LOOSE_PTR(T) SMART_PTR(T, ref_counted, throw_check, heap_storage)
/// Definition for a smart pointer to a reference counted object, stored on the heap
/// that may be NULL
#define DEFINE_LOOSE_PTR(T) DEFINE_SMART_PTR(T, ref_counted, throw_check, heap_storage)

/// Definition for a smart pointer to a reference counted object, stored on the heap
/// that may never be NULL
#define STRICT_PTR(T) SMART_PTR(T, ref_counted, throw_check_strict, heap_storage)
/// Definition for a smart pointer to a reference counted object, stored on the heap
/// that may never be NULL
#define DEFINE_STRICT_PTR(T) DEFINE_SMART_PTR(T, ref_counted, throw_check_strict, heap_storage)
/// Definition for a smart pointer to a com-obkect
#define COM_PTR(T) SMART_PTR(T, com_ref_counted, throw_check, heap_storage)
/// Definition for a smart pointer to a com-object
#define DEFINE_COM_PTR(T) DEFINE_SMART_PTR(T, com_ref_counted, throw_check, heap_storage)

#define SHARED_PTR(T) boost::shared_ptr<T>
#define DEFINE_SHARED_PTR(T) typedef SHARED_PTR(T) T##Ptr;
#define WEAK_PTR(T) boost::weak_ptr<T>
#define DEFINE_WEAK_PTR(T) typedef WEAK_PTR(T) T##Ptr;
